/*
 * 文件名：RealStreamDataDecode.java
 * 版权：亚信联创版权所有
 * 描述：TODO
 * 修改人：yuanze
 * 修改时间：2014年11月13日
 * 修改内容：TODO
 */
package com.ailk.bigdata.etl.realstream.server.protocal.aipr.netty.handler;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ailk.bigdata.etl.common.server.net.ByteUtil;
import com.ailk.bigdata.etl.realstream.server.model.RealStreamDataPack;

/**
 * @description 实时数据包解包
 * @author [xuwei3]
 * @version [版本号,2014年11月13日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class RealStreamDataDecode extends ReplayingDecoder<RealStreamDataPack>
{
	private static Logger logger = LoggerFactory.getLogger(RealStreamDataDecode.class);

	/**
	 * @see io.netty.handler.codec.ByteToMessageDecoder#decode(io.netty.channel.ChannelHandlerContext,
	 *      io.netty.buffer.ByteBuf, java.util.List)
	 */
	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> out) throws Exception
	{
		byteBuf.markReaderIndex();
		// 报文开头'B'
		byteBuf.readByte();
		int dataType = Integer.parseInt(ByteUtil.BinaryToHexString(byteBuf.readBytes(2).array()), 16);
		int packLen = Integer.parseInt(ByteUtil.BinaryToHexString(byteBuf.readBytes(2).array()), 16);
		String reservedF = ByteUtil.BinaryToHexString(byteBuf.readBytes(4).array());
		int dataLen = Integer.parseInt(ByteUtil.BinaryToHexString(byteBuf.readBytes(2).array()), 16);// 数据长度
		ByteBuf content = byteBuf.readBytes(dataLen);
		// 报文结尾'E'
		byteBuf.readByte();
		logger.debug("dataType[" + dataType + "]packLen[" + packLen + "]dataLen[" + dataLen + "]");
		RealStreamDataPack dataPack = RealStreamDataPack.build(dataType, packLen, reservedF, dataLen, content);
		out.add(dataPack);
	}
}
